package com.yuw.control.userinfoRest;

import com.yuw.bean.UserInfoBean;
import com.yuw.service.IUserInfoService;
import com.yuw.utils.MyUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.util.List;

@RestController
@RequestMapping("/apiUser") // 整个Control类的映射路径
public class UserInfoRESTFulControl {

    // springmvc service层的依赖注入
    @Resource
    private IUserInfoService userInfoService;

    /*
    springmvc使用 @RestController注解用于支持Rest风格的编程规范；
    1、控制层类使用@RestController注解；
    2、响应方法上使用@RequestMapping注解，并且指明 value 和 method参数，通过二者的组合进行不同的状态区分；
    3、因为rest的编程是基于ajax的，所以需要实现ajax的返回值（json、xml、text）内容的格式处理；使用ResponseEntity<Object>
       将结果集返回，springmvc会自动将其转换为ajax的数据格式；
    4、因为rest返回的目标是ajax引擎代理，所以需要封装一个ResponseEntity类的实例对象，该对象有springmvc框架用于进行客户端请求的响应处理；
     */
    @RequestMapping(value = "/userinfo/", method = RequestMethod.GET)
    public ResponseEntity<List<UserInfoBean>> queryAllUserInfo() {

        // 调用service层经进行数据库查询操作
        List<UserInfoBean> lstUserInfos = userInfoService.queryAllUserInfo();
        // 在springmvc中直接放回数据结构，springmvc会自动把数据结果集转换为 json数据串发给客户端
        // 如果不是springmvc框架，则需要使用手动或者第三方工具将结果集转换为json字符串发回给客户端
        return new ResponseEntity<>(lstUserInfos, HttpStatus.OK);
    }

    /*
    http://localhost:9091/xxxx/doajaxquery?uid=1
     */
    /*
    springmvc使用 @RestController注解用于支持Rest风格的编程规范；
    1、控制层类使用@RestController注解；
    2、响应方法上使用@RequestMapping注解，并且指明 value 和 method参数，通过二者的组合进行不同的状态区分；
    3、因为rest的编程是基于ajax的，所以需要实现ajax的返回值（json、xml、text）内容的格式处理；使用ResponseEntity<Object>
       将结果集返回，springmvc会自动将其转换为ajax的数据格式；
    4、因为rest返回的目标是ajax引擎代理，所以需要封装一个ResponseEntity类的实例对象，该对象有springmvc框架用于进行客户端请求的响应处理；
    5、使用{变量名}占位符，可以通过路径的方式传递参数值给影响的handler方法，同时可以使用注解  @PathVariable 将，
       路径中的占位符变量和影响方法的形参之间进行绑定；如果名字一样，也需要使用 @PathVariable 注解；
       @PathVariable 注解需要显式使用。

       这正传递参数的方式区别于get传参的方式；
     */
    @RequestMapping(value = "/userinfo/{uid}", method = RequestMethod.GET)
    public ResponseEntity<List<UserInfoBean>> queryUserInfoById(@PathVariable("uid") Integer userId) {

        // 调用service层经进行数据库查询操作
        List<UserInfoBean> lstUserInfos = userInfoService.selectByPrimaryKey(userId);
        // 在springmvc中直接放回数据结构，springmvc会自动把数据结果集转换为 json数据串发给客户端
        // 如果不是springmvc框架，则需要使用手动或者第三方工具将结果集转换为json字符串发回给客户端
        return new ResponseEntity<>(lstUserInfos, HttpStatus.OK);
    }

    /**
     * 保存和修改用于信息
     *
     * @param userInfoBean 用户参数实体类
     * @return 结果视图
     */

    @RequestMapping(value = "/userinfo/", method = RequestMethod.POST)
    public ResponseEntity<List<UserInfoBean>> saveOrUpdateUserInfo(UserInfoBean userInfoBean) {

        // 打印需要保存的实体类型信息
        System.out.println("新增：" + userInfoBean.toString());

        // 调用Service层进行用户信息数据保存和修改操作
        int i = userInfoService.saveOrUpdateUserInfo(userInfoBean);
        // 查询新增之后的所有的数据结果，然后进行显示
        List<UserInfoBean> lstUserInfos = userInfoService.queryAllUserInfo();
        // 根据操作结果进行视图转发处理
        return new ResponseEntity<>(lstUserInfos, HttpStatus.OK);
    }

    /**
     * 保存和修改用于信息
     *
     * @param userInfoBean 用户参数实体类
     * @return 结果视图
     */

    @RequestMapping(value = "/userinfo/{uid}", method = RequestMethod.PUT)
    public ResponseEntity<List<UserInfoBean>> saveOrUpdateUserInfo2(@PathVariable("uid") Integer userId, UserInfoBean userInfoBean) {

        // 打印需要保存的实体类型信息
        System.out.println("新增：" + userInfoBean.toString());

        // 将需要修改的记录的Id值，设置到实体类参数中
        userInfoBean.setUserid(userId);

        // 调用Service层进行用户信息数据保存和修改操作
        int i = userInfoService.saveOrUpdateUserInfo(userInfoBean);
        // 查询新增之后的所有的数据结果，然后进行显示
        List<UserInfoBean> lstUserInfos = userInfoService.queryAllUserInfo();
        // 根据操作结果进行视图转发处理
        return new ResponseEntity<>(lstUserInfos, HttpStatus.OK);
    }


    @RequestMapping(value = "/userinfo/{userId}", method = RequestMethod.DELETE)
    public ResponseEntity<Void> deleteAllUserInfo(@PathVariable("userId") Integer userId) {

        // 调用service层经进行数据库删除操作
        // 调用service层进行删除操作
        int i = userInfoService.deleteUserInfoByID(userId);
        return  new ResponseEntity<Void>(HttpStatus.OK);

    }


}
